﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace LOGIC
{
    public class LogicBooking
    {
        private DB.Bokning currentBooking;
        private DB.LBokningsRad currentBookingRow;

        public LogicBooking()
        {
        }

        public LogicBooking(DB.Bokning dbBokning)
        {
            this.currentBooking = dbBokning;
        }

        private LogicBooking(DB.LBokningsRad bookingRowObject)
        {
            this.currentBookingRow = bookingRowObject;
        }




        private LogicSession session;
        public LogicBooking(LogicSession session)
        {
            this.session = session;
        }


//********************************************************************** Get/Set metoder *********************************************************//
        public int bokningsNr
        {
            get { return currentBooking.bokningsNr; }
        }

        public int gästNr
        {
            get { return (int)currentBooking.gästNr; }
        }

        public string logiID
        {
            get { return currentBookingRow.logiID; }
        }

        public DateTime frånDatum
        {
            get { return currentBookingRow.frånDatum;}
        }

        public DateTime tillDatum
        {
            get { return currentBookingRow.tillDatum; }
        }

        public int GetPrice
        {
            get { return (int)currentBookingRow.pris; }
        }


//*******************************************************************************          *************************************************************//
        /// <summary>
        /// Metod som hämtar ett nytt bokningsnummer
        /// </summary>
        /// <returns></returns>
        public int GetBookingNumber()
        {
            return LogicSession.TheSession.Db.GetBookingNumber();
        }

        /// <summary>
        /// Metod som hämtar gästens kreditgräns för att kontrollera om ändringar skett sedan inläsning.
        /// </summary>
        /// <param name="guestNr">Gästnummer</param>
        /// <returns></returns>
        public int GetGuestCreditLimit(int guestNr)
        {
            return LogicSession.TheSession.Db.GetGuestCreditLimit(guestNr);
        }

        /// <summary>
        /// Metod som skapar en ny bokning skickar med värdena nedan
        /// </summary>
        /// <param name="gästNr">Gästnummer</param>
        /// <param name="personalID">personalId</param>
        /// <param name="avbokningsskydd">avbokningsskydd</param>
        /// <param name="discount">rabatt</param>
        /// <param name="totSum">totalsumma</param>
        public static void CreateBooking(int gästNr, int personalID, bool avbokningsskydd, int discount, int totSum)
        {
            LogicSession.TheSession.Db.CreateBooking(gästNr, personalID, avbokningsskydd, discount, totSum);
        }

        /// <summary>
        /// Metod som skickar vidare informationen från gui för att skapa bokningsrader
        /// </summary>
        /// <param name="lodgingId">logiId</param>
        /// <param name="bookingId">bokningsId</param>
        /// <param name="starDate">startdatum</param>
        /// <param name="stopDate">stoppdatum</param>
        /// <param name="price">pris</param>
        /// <param name="weekNr">veckonummer</param>
        public static void PutInBookingRow(string lodgingId,int bookingID, DateTime starDate, DateTime stopDate, int price, int weekNr)
        {
            LogicSession.TheSession.Db.PutInBookingRow(lodgingId, bookingID,starDate, stopDate, price, weekNr);
        }

        /// <summary>
        /// Metod som uppdaterar en gästs kreditgräns efter bokning.
        /// </summary>
        /// <param name="newCredit"></param>
        /// <param name="guestNr"></param>
        public static void CreditUpdate(int newCredit, int guestNr)
        {
            LogicSession.TheSession.Db.CreditUpdate(newCredit, guestNr);
        }

        /// <summary>
        /// Metod som används för att lägga till en ny bokningsrad när bokning redan existerar.
        /// </summary>
        /// <param name="bookingID">bokningsnummer</param>
        /// <param name="cancelProtection">avbokningsskydd</param>
        /// <param name="price">pris</param>
        public static void BookingRowUpdate(int bookingID, bool cancelProtection, int price)
        {
            LogicSession.TheSession.Db.BookingRowUpdate(bookingID,cancelProtection, price);
        }

        /// <summary>
        /// Metod som skickar vidare de logier och/eller konferenser som skall reserveras 
        /// </summary>
        /// <param name="lodging">logiid/konferensid</param>
        /// <param name="startTime">starttid</param>
        /// <param name="stopTime">sluttid</param>
        public static void ShoppingCart(string lodging, DateTime startTime, DateTime stopTime)
        {
            LogicSession.TheSession.Db.ReserveLodging(lodging,startTime,stopTime);
        }

        /// <summary>
        /// Metod som tar bort de logier och konferenser som finns i reservationslistan för den specifika bokningen.
        /// </summary>
        /// <param name="lodging">logi/konferensid</param>
        /// <param name="startTime">starttid</param>
        /// <param name="stopTime">sluttid</param>
        public static void DropReservedLodging(string lodging, DateTime startTime, DateTime stopTime)
        {
            LogicSession.TheSession.Db.DropReservedLodging(lodging,startTime,stopTime);
        }


        /// <summary>
        /// Metod som tar bort en bokning ur databasen
        /// </summary>
        /// <param name="bokningsNr">bokningsnummer</param>
        public static void DropBookingLodging(int bokningsNr)
        {
            LogicSession.TheSession.Db.DropBookingLodging(bokningsNr);
        }

        /// <summary>
        /// Metod som hämtar en gästs bokningshistorik för logier
        /// </summary>
        /// <param name="tempGuestID">Gästnummer</param>
        /// <returns></returns>
        public List<string> GetGuestHistory(int tempGuestID)
        {
            return LogicSession.TheSession.Db.GetGuestHirstory(tempGuestID);
        }

        /// <summary>
        /// Metod som hämtar en gästs bokningshistorik för konferensrum
        /// </summary>
        /// <param name="tempGuestID">Gästnummer</param>
        /// <returns></returns>
        public List<string> GetGuestHistoryConferens(int tempGuestID)
        {
            return LogicSession.TheSession.Db.GetGuestHistoryConferens(tempGuestID);
        }

        /// <summary>
        /// Metod som kontrollerar om gästen bott på fjällcentret tidigare.
        /// </summary>
        /// <param name="guestNr">Gästnummer</param>
        /// <param name="bookingID">bokningsnummer</param>
        /// <returns></returns>
        public bool PeriodBeforeStartDateCheck(int guestNr, int bookingID)
        {
            return LogicSession.TheSession.Db.PeriodBeforeStartDateCheck(guestNr, bookingID);
        }

        //********************************************************************* Visa/Redigera *************************************************************//

        /// <summary>
        /// Metod som hämtar bokningar utifrån gästnummer för företagsgäster
        /// </summary>
        /// <param name="tempCoGuestId">Gästnummer</param>
        /// <returns></returns>
        public IQueryable GetBookingByCoGuestId(int tempCoGuestId)
        {
            return LogicSession.TheSession.Db.GetBookingByCoGuestId(tempCoGuestId);
        }

        /// <summary>
        /// Metod som hämtar bokningar utifrån gästnummer för privatgäster
        /// </summary>
        /// <param name="tempPrGuestId">Gästnummer</param>
        /// <returns></returns>
        public IQueryable GetBookingByPrGuestId(int tempPrGuestId)
        {
            return LogicSession.TheSession.Db.GetBookingByPrGuestId(tempPrGuestId);
        }

        /// <summary>
        /// Metod som hämtar bokning utifrån bokningsnummer.
        /// </summary>
        /// <param name="tempId">bokningsnummer</param>
        /// <returns></returns>
        public IQueryable GetBookingById(int tempId)
        {
            return LogicSession.TheSession.Db.GetBookingById(tempId);
        }

        /// <summary>
        /// Metod som söker ut bokningar på företagsnamn
        /// </summary>
        /// <param name="tempId">företagsnamn</param>
        /// <returns></returns>
        public IQueryable GetBookingByIdCompany(int tempId)
        {
            return LogicSession.TheSession.Db.GetBookingByIdCompany(tempId);
        }

        /// <summary>
        /// Metod som söker efter bokningar på privatgästs för- och/eller efternamn.
        /// </summary>
        /// <param name="tempName">Namn</param>
        /// <returns></returns>
        public IQueryable GetBookingByName(string tempName)
        {
            return LogicSession.TheSession.Db.GetBookingByName(tempName);
        }


        /// <summary>
        /// Metod som söker efter bokningar på företagsnamn
        /// </summary>
        /// <param name="tempCoName">Företagsnamn</param>
        /// <returns></returns>
        public IQueryable GetBookingByCoName(string tempCoName)
        {
            return LogicSession.TheSession.Db.GetBookingByCompanyName(tempCoName);
        }

        /// <summary>
        /// Metod som hämtar bokningsraderna för en specifik bokning
        /// </summary>
        /// <param name="tempBookingId">bokningsnummer</param>
        /// <returns></returns>
        public List<string> GetBookingRows(int tempBookingId)
        {
            return LogicSession.TheSession.Db.GetBookingRow(tempBookingId);
        }
        
        //=========================================================================================
        //Skriver bokning till fil.
        public void WriteToFile(string BookingNr, string cancelFee, string SumNoVat, string Vat, string TotalSum)
        {
            //string toFile = string.Format("{0}\t{1}\t{2}\t{3}\t{4}", BookingNr, cancelFee, SumNoVat, Vat, TotalSum);

            //FileStream stream = new FileStream("Economyfile.txt", FileMode.OpenOrCreate);
            //StreamWriter writer = new StreamWriter("EconomyFile.txt", true);

            //writer.WriteLine(toFile);
            //writer.Flush();
            //writer.Close();
        }
        //=====================================================================================

        public void SendFile()
        {
            //?????Här ska finnas kod för att skicka fil till ekonomiavdelningen?????

            //Skriver över innehållet i filen EconomyFile.
            StreamWriter writer = new StreamWriter("EconomyFile.txt", false);
            writer.Write("");
            writer.Flush();
            writer.Close();
        }
    }
}
